/*
*   1.字串为空或者全是空格，返回0；
*   2. 字串的前缀空格需要忽略掉；
*   3. 忽略掉前缀空格后，遇到的第一个字符，如果是‘+’或‘－’号，继续往后读；如果是数字，则开始处理数字；如果不是前面的2种，返回0；
*   4. 处理数字的过程中，如果之后的字符非数字，就停止转换，返回当前值；
*   5. 在上述处理过程中，如果转换出的值超出了int型的范围，就返回int的最大值或最小值。
*/
int myAtoi(string str) {
    //int INT_MAX = 2147483647;//上限
    //int INT_MIN = -2147483647;//下限
    char mark = ' ';//保存符号
    long value = 0;//使用long存储，防止int溢出
    int step = 0;//记录自动机的状态
    for (int i = 0; i < str.size(); i++)
    {
        if (str[i] != ' ') {
            //如果是数字，状态为2，前面有若干个0不影响，10*0 == 0
            if (str[i] >= '0' && str[i] <= '9') {
                step = 2;
                value = 10 * value + (str[i] - '0');
                //溢出判断
                if (value > ((long)INT_MAX + 1))
                    break;
            //只有在状态0时出现了正负号才是正常的，其他属于错误情况
            } else if (step == 0 && (str[i] == '+' || str[i] == '-')) {
                mark = str[i];
                cout << mark << endl;
                step = 1;
            } else {
                break;
            }
        } else {
            //对于空格，只有在0状态才是正常的
            if (step != 0)
                break;
        }
    }
    //先把正负号加上再判断是否溢出，正数负数的边界不一样
    if (mark == '-')
        value = 0 - value;
    if (value > INT_MAX)
        return INT_MAX;
    if (value < INT_MIN)
        return INT_MIN;
    return (int)value;
}
